package com.rui.cn.provider.service.redis;


import com.rui.cn.enums.RedisExpireTime;

import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * Redis操作接口
 * @date 2017年9月21日 下午3:17:54 
 * @author Qin Dachang
 */
public interface RedisService {

	/**
	 * 删除缓存<br>
	 * 根据key精确匹配删除
	 * @param key
	 */
	public void del(String... key);
	
	/**
	 * 批量删除<br>
	 * （该操作会执行模糊查询，请尽量不要使用，以免影响性能或误删）
	 * @param pattern
	 */
	public void batchDel(String... pattern);

	/**
	 * 取得缓存（int型）
	 * @param key
	 * @return
	 */
	public Integer getInt(String key);

	/**
	 * 取得缓存（字符串类型）
	 * @param key
	 * @return
	 */
	public String getStr(String key);
	
	/**
	 * 取得缓存（字符串类型）
	 * @param key
	 * @param retain 是否保留
	 * @return
	 */
	public String getStr(String key, boolean retain);

	/**
	 * 获取缓存<br>
	 * 注：基本数据类型(Character除外)，请直接使用get(String key, Class<T> clazz)取值
	 * @param key
	 * @return
	 */
	public Object getObj(String key) ;
	
	/**
	 * 获取缓存<br>
	 * 注：java 8种基本类型的数据请直接使用get(String key, Class<T> clazz)取值
	 * @param key
	 * @param retain 是否保留
	 * @return
	 */
	public Object getObj(String key, boolean retain);

	/**
	 * 获取缓存<br>
	 * 注：该方法暂不支持Character数据类型
	 * @param key key
	 * @param clazz 类型
	 * @return
	 */
	public <T> T get(String key, Class<T> clazz);

	/**
	 * 获取缓存json对象<br>
	 * @param key key
	 * @param clazz 类型
	 * @return
	 */
	public <T> T getJson(String key, Class<T> clazz);

	/**
	 * 将value对象写入缓存
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void set(String key, Object value, RedisExpireTime time);

	/**
	 * 将value对象以JSON格式写入缓存
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void setJson(String key, Object value, RedisExpireTime time);

	/**
	 * 更新key对象field的值
	 * @param key 缓存key
	 * @param field 缓存对象field
	 * @param value 缓存对象field值
	 */
	public void setJsonField(String key, String field, String value);

	/**
	 * 递减操作
	 * @param key
	 * @param by
	 * @return
	 */
	public double decr(String key, double by);

	/**
	 * 递增操作
	 * @param key
	 * @param by
	 * @return
	 */
	public double incr(String key, double by);
	
	/**
	 * 获取double类型值
	 * @param key
	 * @return
	 */
	public double getDouble(String key);

	/**
	 * 设置double类型值
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void setDouble(String key, double value, RedisExpireTime time);

	/**
	 * 设置double类型值
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void setInt(String key, int value, RedisExpireTime time);

	/**
	 * 将map写入缓存
	 * @param key
	 * @param map
	 * @param time 失效时间(秒)
	 */
	public <T> void setMap(String key, Map<String, T> map, RedisExpireTime time);

	/**
	 * 将map写入缓存
	 * @param key
	 * @param time 失效时间(秒)
	 */
	public <T> void setMap(String key, T obj, RedisExpireTime time);

	/**
	 * 向key对应的map中添加缓存对象
	 * @param key
	 * @param map
	 */
	public <T> void addMap(String key, Map<String, T> map);

	/**
	 * 向key对应的map中添加缓存对象
	 * @param key cache对象key
	 * @param field map对应的key
	 * @param value 值
	 */
	public void addMap(String key, String field, String value);
	
	/**
	 * 向key对应的map中添加缓存对象
	 * @param key cache对象key
	 * @param field map对应的key
	 * @param obj 对象
	 */
	public <T> void addMap(String key, String field, T obj);

	/**
	 * 获取map缓存
	 * @param key
	 * @param clazz
	 * @return
	 */
	public <T> Map<String, T> mget(String key, Class<T> clazz);
	
	/**
	 * 获取map缓存
	 * @param key
	 * @param clazz
	 * @return
	 */
	public <T> T getMap(String key, Class<T> clazz);
	
	/**
	 * 获取map缓存中的某个对象
	 * @param key
	 * @param field
	 * @param clazz
	 * @return
	 */
	public <T> T getMapField(String key, String field, Class<T> clazz);
	
	/**
	 * 删除map缓存中指定的key
	 * @date 2018年3月16日 下午6:16:26 
	 * @author Qin Dachang
	 * @param <T>
	 * @param key 缓存的map的key
	 * @param clazz  缓存的对象
	 * @param field  map中的key
	 */
	public <T> void delMapField(String key, Class<T> clazz, Object... field);

	/**
	 * 指定缓存的失效时间
	 * @author FangJun
	 * @date 2016年8月14日
	 * @param key 缓存KEY
	 * @param time 失效时间(秒)
	 */
	public void expire(String key, RedisExpireTime time);

	/**
	 * 短信缓存
	 * 
	 */
	public void setIntForPhone(String key, Object value, int time);

	/**
	 * 模糊查询keys
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern);
	
	/**
	 * 获取redis集合
	 * @param <T>
	 * @param key
	 * @param t
	 */
	public <T> List<T> getList(String key, Class<T> clazz);
	
	/**
	 * 获取redis集合
	 * @param key
	 * @param clazz
	 * @param start 起始位置
	 * @param end 结束位置
	 * @return
	 */
	public <T> List<T> getList(String key, Class<T> clazz, Long start, Long end);
	
	/**
	 * 获取集合长度
	 * @param <T>
	 * @param key
	 */
	public Long getListSize(String key);
	
	/**
	 * 将集合存入redis
	 * @param key
	 * @param list
	 * @param time
	 */
	public <T> void setList(String key, List<T> list, RedisExpireTime time);
	
	/** 删除hash中某个key
	 * @date 2018年3月16日 下午2:42:41 
	 * @author zhang ruilin
	 * @param key
	 * @param filed
	 */
	public void delMapFiled(String key, String filed);
	
	/**
	 * 更新或新增. 
	 * 删除的key增加只是为了在实体更新时同步到缓存，<p/>
	 * 如商品中，同时修改商家与商品货号，这时候传入后台的参数商品商家与货号已经修改，<p/>
	 * 所以同时需要修改
	 * @date 2018年3月16日 下午6:04:03 
	 * @author Chen Qixiang
	 * @param key 新增key
	 * @param hkey 新增的field
	 * @param clazz 将要被反射的dto类class
	 * @param entity info实体
	 * @param delKey 
	 * @param  delHKey 删除的field
	 */
	public<T,E> void updOrAddForHash(String key, String hkey, Class<T> clazz, E entity, String delKey, String delHKey) throws Exception;
	
}
